// 也可以直接使用字面量进行类型声明
let d: 10;
d = 10;

// 可以使用 | 来连接多个类型
let e: "male" | "female";
e = "male";
e = "female";

let f: boolean | string;
f = true;
f = "hello";

// any 表示的是任意类型，一个变量设置类型为any相当于对该变量关闭了TS的类型检测
// 使用TS时，不建议使用any类型
let g: any; // 显式的any

// 声明变量如果不指定类型，则TS解析器会自动判断变量的类型为any（隐式的any）
// let g;
g = 10;
g = "hello";
g = true;

// unknown 表示未知类型的值
let h: unknown;
h = 10;
h = "hello";
h = true;

let i: string;

// g 的类型是any，它可以赋值给任意变量
// i = g;

h = "hello";

// unknown 实际上就是一个类型安全的any
// unknown类型的值不能直接赋值给其他变量
// i = h; // Type 'unknown' is not assignable to type 'string'.

// 解决办法：
// 1. 先判断类型，再赋值
if (typeof h === "string") {
  i = h;
}
// 2. 类型断言，可以用来告诉解析器变量的实际类型
/**
 * 语法
 *  1. 变量 as 类型
 *  2. <类型>变量
 * 
 * */ 
i = h as string;
i = <string>h;

// 类型不确定时候，能用unknown就不要用any


// void 用来表示空，以函数为例，就表示没有返回值的函数
function fn(): void {
}

// never 表示永远不会返回结果
function fn2(): never {
    throw new Error("报错了！");
}

// 20240316 p4 end
